//
// Created by dqchen on 2023/1/4.
//

#ifndef QUEST_0_1_INTERMEDIATE_H
#define QUEST_0_1_INTERMEDIATE_H
#include "meta.h"
#include <vector>
#include "symtab.h"

class Order {
    Operation op;   //操作符
    Var* val;       //左值
    Var* var;       //右值
    Var* res;       //结果
    Func* func;     //函数
    Var* farg;      //函数调用的入参
    Order* next;    //下条指定
    string label;   //标签
public:
    void print(FILE *midf);
    void genAsm(FILE *asmf);
    Order();
    Order(string label);
    Order(Operation o, Var *l, Var *r, Var *s, Func *f);
    Order(Operation o, Func *f);
    Order(Operation o, Var *v);
    Order(Operation op, Order* o, Var* v);
    ~Order();
};

class OrderGenerator{
    Symtab& symtab;    //变量符号表
    FILE* outfile;  //中间代码输出文件
    int tempNo = 0;
public:
    string genTempNo(int type, string prefix);  //生成临时变量的序号
    void genEntryCode(Func* func);     //生成函数入口指令
    void genExitCode(Func* func);     //生成函数出口指令
    void genOpCode(Operation op, Var* res, Var* val, Var* var); //生成操作类指令
    void genVarAssign(Var* var);   //生成变量赋值指令
    void genRetCode(Var* var, Func* func);   //生成函数返回指令
    void genFuncCode(Operation op, Func* func, vector<Var*> args, Var* res);  //生成函数体指令
    Var* genLeftCode(Operation op, Var* v);   //生成左操作符指令

    void genMid();
    OrderGenerator(Symtab& s, FILE *file);
    ~OrderGenerator();

};


#endif //QUEST_0_1_INTERMEDIATE_H
